在前一篇,我們談到了深度學習中的正規化與正則化,重點在於如何避免過擬合並保持訓練穩定。然而,光是解決過擬合還不夠:在龐大的神經網路裡,我們還得面對另一個關鍵問題——如何有效率地找到參數的最佳解。
這就是「優化方法 (Optimization)」的核心任務。深度學習的訓練,本質上是透過梯度下降類方法來最小化損失函數。但在實務上,單純的梯度下降往往不足,因此衍生出各種改良版演算法。
在數學理論上,假設我們要最小化的目標函數是損失函數 $L(\theta)$,其參數更新規則來自於梯度下降:
$$
\theta_{t+1} = \theta_t - \eta \nabla_\theta L(\theta_t)
$$
其中:
這個公式看似簡單,但實務上有幾個挑戰:
因此,雖然梯度下降是核心,但各種優化方法的改進就是針對這些問題而來。
一次使用所有樣本計算梯度並更新參數。
每次隨機抽取一筆樣本進行更新:
$$
\theta_{t+1} = \theta_t - \eta \nabla_\theta L(\theta_t; x^{(i)}, y^{(i)})
$$
綜合兩者優點,常用一個小批次 (例如 32 或 128 筆樣本) 計算梯度。
實務現況: Mini-Batch 是深度學習中幾乎唯一的選擇。
模擬物理世界的「慣性」: 更新不僅依賴當前梯度,還加上之前梯度的指引。
$$
v_{t+1} = \gamma v_t + \eta \nabla_\theta L(\theta_t)
$$
$$
\theta_{t+1} = \theta_t - v_{t+1}
$$
其中 $\gamma$ 是動量係數 (常設為 0.9)。
NAG 在更新前,先看「往動量方向走一步後的梯度」,再進行修正:
$$
v_{t+1} = \gamma v_t + \eta \nabla_\theta L(\theta_t - \gamma v_t)
$$
$$
\theta_{t+1} = \theta_t - v_{t+1}
$$
優點: 預先「探路」,避免過度衝過頭,收斂更快。
為了解決「不同維度梯度大小不一致」的問題,自適應演算法讓每個參數都有自己的學習率。
透過累積歷史梯度平方,自動調整學習率:
$$
\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} \nabla_\theta L(\theta_t)
$$
對 Adagrad 改進:引入「指數加權平均」而非無限累積。
$$
E[g^2]t = \rho E[g^2]{t-1} + (1-\rho) g_t^2
$$
Adam 結合 Momentum 與 RMSProp 的優點。
更新規則:
$$
m_t = \beta_1 m_{t-1} + (1-\beta_1) g_t
$$
$$
v_t = \beta_2 v_{t-1} + (1-\beta_2) g_t^2
$$
$$
\theta_{t+1} = \theta_t - \eta \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon}
$$
優化方法是深度學習的核心基礎。從最早的 SGD,到 Momentum、RMSProp,再到幾乎成為預設的 Adam,每一次改良都在解決「如何在複雜地形中高效下降」這個問題。
可以這樣理解:
在進一步探討 RNN、LSTM、Transformer 等複雜架構之前,理解這些優化方法能讓我們對深度學習的訓練過程有更全面的把握。